package persi.futbol;

import java.util.List;
import java.util.Random;

import persi.casosDeUso.CasoDeUso;
import persi.futbol.formacion.Formacion;
import persi.futbol.partidos.PartidoCopa;
import persi.futbol.partidos.PartidoSimple;
import persi.hibernate.Home;

public class Crear100PartidosDeCopaConAlgunEmpate extends CasoDeUso {

	private static int index = 0;

	private static Integer getIndex() {
		final int ret = Crear100PartidosDeCopaConAlgunEmpate.index;
		Crear100PartidosDeCopaConAlgunEmpate.index++;
		return ret;
	}

	List<Equipo> equipos;

	Home<PartidoSimple> partidoSimpleHome = new Home<PartidoSimple>(
			PartidoSimple.class);
	Home<PartidoCopa> partidoCopaHome = new Home<PartidoCopa>(PartidoCopa.class);

	@Override
	public void casoDeUso() {
		for (int i = 1; i <= 100; i++) {
			this.equipos = new Home<Equipo>(Equipo.class).todos();
			final Random random = new Random();
			final Equipo equipo1 = this.equipos.get(random.nextInt(equipos
					.size()));
			final Equipo equipo2 = this.cualquierOtroEquipo(equipo1, random);
			this.crearPartidoEntre(equipo1, equipo2, random);
		}
	}

	private PartidoSimple creaPartidoSimple(final Equipo equipo1,
			final Equipo equipo2, final Random random) {
		final Formacion formacion1 = equipo1.armarFormacion();
		final Formacion formacion2 = equipo2.armarFormacion();
		final PartidoSimple partido = new PartidoSimple(equipo1, formacion1,
				equipo2, formacion2);
		partido.setNombreDelPartido("PartidoSimpleEnCopa"
				+ Crear100PartidosDeCopaConAlgunEmpate.getIndex());
		final int goles = random.nextInt(7);
		partido.setGolesEquipo1(goles);
		partido.setGolesEquipo2(6 - goles);
		return partido;
	}

	private void crearPartidoEntre(final Equipo equipo1, final Equipo equipo2,
			final Random random) {
		final PartidoSimple partidoSimple1 = this.creaPartidoSimple(equipo1,
				equipo2, random);
		final PartidoSimple partidoSimple2 = this.creaPartidoSimple(equipo2,
				equipo1, random);
		final PartidoCopa partidoCopa = new PartidoCopa(partidoSimple1,
				partidoSimple2);
		partidoCopa.setNombreDelPartido("PartidoDeCopa"
				+ Crear100PartidosDeCopaConAlgunEmpate.getIndex());
		this.definirEmpate(partidoCopa);
		this.partidoCopaHome.insertar(partidoCopa);
	}

	private Equipo cualquierOtroEquipo(final Equipo equipo1, final Random random) {
		Equipo equipo = equipo1;
		while (equipo.equals(equipo1)) {
			equipo = this.equipos.get(random.nextInt(equipos.size()));
		}
		return equipo;

	}

	private void definirEmpate(final PartidoCopa partidoCopa) {
		if (!this.esEmpate(partidoCopa))
			return;
		this.jugarPrimeraRonda(partidoCopa);
		if (!this.esEmpate(partidoCopa))
			return;
		this.definirPenales(partidoCopa);
	}

	private void definirPenales(final PartidoCopa partidoCopa) {
		final Random random = new Random();
		while (partidoCopa.getGolesPenalEquipo1() == partidoCopa
				.getGolesPenalEquipo2()) {
			if (random.nextBoolean()) {
				partidoCopa.setGolesPenalEquipo1(partidoCopa
						.getGolesPenalEquipo1() + 1);
			}
			if (random.nextBoolean()) {
				partidoCopa.setGolesPenalEquipo2(partidoCopa
						.getGolesPenalEquipo2() + 1);
			}
		}

	}

	private boolean esEmpate(final PartidoCopa partidoCopa) {
		final int golesEquipo1 = partidoCopa.getPartido1().getGolesEquipo1()
				+ partidoCopa.getPartido2().getGolesEquipo1()
				+ partidoCopa.getGolesPenalEquipo1();
		final int golesEquipo2 = partidoCopa.getPartido1().getGolesEquipo2()
				+ partidoCopa.getPartido2().getGolesEquipo2()
				+ partidoCopa.getGolesPenalEquipo2();
		return golesEquipo1 == golesEquipo2;
	}

	private void jugarPrimeraRonda(final PartidoCopa partidoCopa) {
		final Random random = new Random();
		for (int i = 1; i <= 5; i++) {
			if (random.nextBoolean()) {
				partidoCopa.setGolesPenalEquipo1(partidoCopa
						.getGolesPenalEquipo1() + 1);
			}
			if (random.nextBoolean()) {
				partidoCopa.setGolesPenalEquipo2(partidoCopa
						.getGolesPenalEquipo2() + 1);
			}
		}

	}

}
